package com.tosee.process.impl;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;

import com.tosee.exception.GeneriqueException;
import com.tosee.model.allocine.AlloEpisode;
import com.tosee.model.allocine.AlloSaison;
import com.tosee.model.allocine.AlloSerie;
import com.tosee.model.dbTosee.Episode;
import com.tosee.model.dbTosee.Saison;
import com.tosee.model.dbTosee.Serie;
import com.tosee.model.dbTosee.User;
import com.tosee.model.dto.AbstractDto;
import com.tosee.model.dto.CodeDto;
import com.tosee.model.dto.ListeCodeDto;
import com.tosee.model.dto.RechercheDto;
import com.tosee.model.dto.UserDto;
import com.tosee.process.AbstractBusinessProcess;
import com.tosee.process.IUserBusinessProcess;

/**
 * Classe BP pour la gestion des utilisateurs
 * 
 * @author robint
 */
@Service
public class UserBusinessProcess extends AbstractBusinessProcess implements IUserBusinessProcess {

    /**
     * {@inheritDoc}
     */
    @Override
    public UserDto authentifier(AbstractDto _abstractDto) {
        UserDto retour = null;
        if(_abstractDto != null && _abstractDto.getAuthentification() != null) {

            retour = getBusinessLogicProvider().getUserBusinessLogic().authentifier(_abstractDto);
        }

        return retour;
    }

    @Override
    public Integer creerUtilisateur(UserDto _user) throws GeneriqueException {
        Integer retour = null;
        if(_user != null) {
            retour = getBusinessLogicProvider().getUserBusinessLogic().creerUtilisateur(_user);
        }
        return retour;
    }

    @Override
    public Boolean getAjouterAbonnementSerie(CodeDto _codeDto) throws GeneriqueException {
        Boolean retour = false;

        RechercheDto rechercheDto = new RechercheDto();
        rechercheDto.setCode(_codeDto.getCode());
        rechercheDto.setAuthentification(_codeDto.getAuthentification());

        // recuperation de la série en base locale à partir de son identifiant allocine
        Serie serieLocale = getBusinessLogicProvider().getSerieBusinessLogic().getSeriesByCodeAllocine(rechercheDto);

        // Serie non présente localement
        if(serieLocale == null) {

            // On recupere les info sur allocine
            AlloSerie alloSerie = getBusinessLogicProvider().getAllocineBusinessLogic().getSerieInfoByRechercheCode(
                    rechercheDto);

            // On l'ajoute en base locale
            serieLocale = getBusinessLogicProvider().getSerieBusinessLogic().ajouterSerieLocale(alloSerie);
        }
        if(serieLocale != null) {
            // Si on est ici c'est que les authentifications se sont bien passées et donc que nous avons l'ID user dans l'authentification DTO
            User user = getBusinessLogicProvider().getUserBusinessLogic().getUser(_codeDto);
            // On la lie à l'utilisateur
            getBusinessLogicProvider().getUserBusinessLogic().ajouterSerieToUser(user, serieLocale);
            // user.getListSerie().add(serieLocale);

            retour = true;
        }

        return retour;
    }

    @Override
    public Boolean ajouterEpisodeVu(ListeCodeDto _listeCode) throws GeneriqueException {
        Boolean retour = false;

        RechercheDto rechercheDto = null;
        Episode episodeLocale = null;
        if(_listeCode != null && CollectionUtils.isNotEmpty(_listeCode.getListeCode())) {
            for(Integer code : _listeCode.getListeCode()) {
                rechercheDto = new RechercheDto();
                rechercheDto.setCode(code);
                rechercheDto.setAuthentification(_listeCode.getAuthentification());

                // recuperation de l'épisode en base locale à partir de son identifiant allocine
                episodeLocale = getBusinessLogicProvider().getEpisodeBusinessLogic().getEpisodeByCodeAllocine(
                        rechercheDto);

                if(episodeLocale == null) {

                    AlloEpisode alloEpisode = getBusinessLogicProvider().getAllocineBusinessLogic().getEpisodeInfo(
                            rechercheDto);

                    // Chargement de la série
                    RechercheDto rechercheSerie = new RechercheDto();
                    rechercheSerie.setCode(alloEpisode.getIdSerie());
                    rechercheSerie.setAuthentification(_listeCode.getAuthentification());
                    Serie serieLocale = getBusinessLogicProvider().getSerieBusinessLogic().getSeriesByCodeAllocine(
                            rechercheSerie);

                    if(serieLocale == null) {
                        AlloSerie alloSerie = getBusinessLogicProvider().getAllocineBusinessLogic()
                                .getSerieInfoByRechercheCode(rechercheSerie);

                        serieLocale = getBusinessLogicProvider().getSerieBusinessLogic().ajouterSerieLocale(alloSerie);
                    }

                    // Chargement de la saison
                    RechercheDto rechercheSaison = new RechercheDto();
                    rechercheSaison.setCode(alloEpisode.getIdSaison());
                    rechercheSaison.setAuthentification(_listeCode.getAuthentification());
                    Saison saisonLocale = getBusinessLogicProvider().getSaisonBusinessLogic().getSaisonByCodeAllocine(
                            rechercheSaison);

                    if(saisonLocale == null) {
                        AlloSaison alloSaison = getBusinessLogicProvider().getAllocineBusinessLogic()
                                .getSaisonInfoByRechercheCode(rechercheSaison);

                        saisonLocale = getBusinessLogicProvider().getSaisonBusinessLogic().ajouterSaisonLocale(
                                alloSaison);
                    }

                    episodeLocale = getBusinessLogicProvider().getEpisodeBusinessLogic().ajouterEpisodeLocale(
                            alloEpisode);
                }
                if(episodeLocale != null) {
                    // Si on est ici c'est que les authentifications se sont bien passées et donc que nous avons l'ID user dans l'authentification DTO
                    User user = getBusinessLogicProvider().getUserBusinessLogic().getUser(_listeCode);
                    // On la lie à l'utilisateur
                    getBusinessLogicProvider().getUserBusinessLogic().ajouterEpisodeToUser(user, episodeLocale);
                    // user.getListSerie().add(serieLocale);
                    retour = true;
                }
            }
        }
        return retour;
    }
}
